package com.miracle.toolbox.file.copyFileWithParents;


import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;

public class CopyFile {
    public static void main(String[] args) {
        copy("G:\\批量导入模版\\code\\文件列表lb.txt","G:\\批量导入模版\\code\\nbms-ebank-lb","nbms-ebank");
        copy("G:\\批量导入模版\\code\\文件列表svn.txt","G:\\批量导入模版\\code\\nbms-ebank-svn","nbms-ebank");
    }

    /**
     * eg:
     * 文件列表.txt:
     *      F:\ideaWorkspace\aoxin\nbms-ebank\nbms-ebank-dal\src\main\java\com\huateng\nbms\ebank\dal\model\EbankDraftContract.java
     *      F:\ideaWorkspace\aoxin\nbms-ebank\nbms-ebank-dal\src\main\java\com\huateng\nbms\ebank\dal\dao\EbankBankDataDAOImpl.java
     *      F:\ideaWorkspace\aoxin\nbms-ebank\nbms-ebank-dal\src\main\java\com\huateng\nbms\ebank\dal\dao\EbankBankDataDAO.java
     *  目标文件夹：G:\批量导入模版\code
     *  根节点：nbms-ebank
     *  结果文件列表：
     *      G:\批量导入模版\code\nbms-ebank\nbms-ebank-dal\src\main\java\com\huateng\nbms\ebank\dal\model\EbankDraftContract.java
     *      G:\批量导入模版\code\nbms-ebank\nbms-ebank-dal\src\main\java\com\huateng\nbms\ebank\dal\dao\EbankBankDataDAOImpl.java
     *      G:\批量导入模版\code\nbms-ebank\nbms-ebank-dal\src\main\java\com\huateng\nbms\ebank\dal\dao\EbankBankDataDAO.java
     */
    /**
     * 复制多个文件到目标文件夹，并且基于一个根目录保留之后的文件结构
     * *遇到相同文件直接覆盖
     * *不存在根路径的文件不复制，并返回未复制的文件列表
     * *空文件夹可以复制
     * @param source 源文件列表（每行一个文件的绝对路径）
     * @param target 目标文件夹（根文件夹之后的结构会保留，复制到这里，目标文件夹如果不存在会自动创建）
     * @param rootPath 根文件夹（从这之后的目录结构会保留，源文件路径不包含这个文件夹将会打印出来）
     * @return 复制错误文件列表
     */
    public static List<String> copy(String source, String target, String rootPath){
        List<String> errList = new ArrayList<>();

        File sourceFile = new File(source);
        List<String> sourceFileList = null;//源文件列表
        try {
            sourceFileList = Files.readAllLines(sourceFile.toPath());
            // sourceFileList = Files.lines(Paths.get(source)).collect(Collectors.toList());//java8以后
        } catch (IOException e) {
            e.printStackTrace();
        }

        for (String sourcePath : sourceFileList) {
            System.out.println("源文件路径："+sourcePath);
            if (!new File(sourcePath).exists()){
                System.out.println("源文件不存在，跳过该文件");
                continue;
            }

            //获取目标文件路径
            int rootIdx = sourcePath.indexOf(File.separator+rootPath+File.separator);
            if (rootIdx<0){
                errList.add(sourcePath);
                System.out.println("不包含根文件夹："+sourcePath);
                System.out.println("文件复制失败\n");
                continue;
            }
            String relativePath = sourcePath.substring(rootIdx);
            String targetPath = target + File.separator + relativePath;
            System.out.println("目标文件路径："+targetPath);


            File file = new File(targetPath);
            if (file.isDirectory()){
                if (file.exists()){
                    System.out.println("目标文件是文件夹，已存在");
                } else {
                    file.mkdirs();
                    System.out.println("目标文件是文件夹，创建成功");
                }
            } else {
                if (file.exists()){
                    System.out.println("目标文件是文件，已存在，将会覆盖");
                } else {
                    if (!file.getParentFile().exists()){
                        file.getParentFile().mkdirs();
                        System.out.println("目标文件是文件，父文件夹创建成功");
                    } else {
                        System.out.println("目标文件是文件，父文件夹已存在");
                    }
                    try {
                        file.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    System.out.println("目标文件是文件，创建成功");

                }

                //开始复制文件
                FileChannel inputChannel = null;
                FileChannel outputChannel = null;
                try {
                    inputChannel = new FileInputStream(sourcePath).getChannel();
                    outputChannel = new FileOutputStream(targetPath).getChannel();
                    outputChannel.transferFrom(inputChannel, 0, inputChannel.size());

                }catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        inputChannel.close();
                        outputChannel.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("文件复制成功\n");
            }
        }

        if (errList.size()>0){
            System.out.println("复制失败附件列表：");
            errList.stream().forEach(e-> System.out.println(e));

        } else {
            System.out.println("文件全部复制成功");
        }
        return errList;
    }
}
